{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:55:35.014158Z",
     "start_time": "2019-04-10T11:55:32.175391Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.integrate import quad\n",
    "mpl.rcParams['font.family'] = 'serif'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:55:35.063049Z",
     "start_time": "2019-04-10T11:55:35.017629Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#BSM模型定价\n",
    "def dN(x):\n",
    "    ''' Probability density function of standard normal random variable x. '''\n",
    "    return math.exp(-0.5 * x ** 2) / math.sqrt(2 * math.pi)\n",
    "\n",
    "def N(d):\n",
    "    ''' Cumulative density function of standard normal random variable x. '''\n",
    "    return quad(lambda x: dN(x), -20, d, limit=50)[0]\n",
    "\n",
    "def d1f(St, K, t, T, r, sigma):\n",
    "    ''' Black-Scholes-Merton d1 function.\n",
    "        Parameters see e.g. BSM_call_value function. '''\n",
    "    d1 = (math.log(St / K) + (r + 0.5 * sigma ** 2)\n",
    "          * (T - t)) / (sigma * math.sqrt(T - t))\n",
    "    return d1\n",
    "\n",
    "#\n",
    "# Valuation Functions\n",
    "#\n",
    "def BSM_call_value(St, K, t, T, r, sigma):\n",
    "    ''' Calculates Black-Scholes-Merton European call option value.\n",
    "    Parameters\n",
    "    ==========\n",
    "    St : float\n",
    "        stock/index level at time t\n",
    "    K : float\n",
    "        strike price\n",
    "    t : float\n",
    "        valuation date\n",
    "    T : float\n",
    "        date of maturity/time-to-maturity if t = 0; T > t\n",
    "    r : float\n",
    "        constant, risk-less short rate\n",
    "    sigma : float\n",
    "        volatility\n",
    "    Returns\n",
    "    =======\n",
    "    call_value : float\n",
    "        European call present value at t\n",
    "    '''\n",
    "    d1 = d1f(St, K, t, T, r, sigma)\n",
    "    d2 = d1 - sigma * math.sqrt(T - t)\n",
    "    call_value = St * N(d1) - math.exp(-r * (T - t)) * K * N(d2)\n",
    "    return call_value\n",
    "\n",
    "def BSM_put_value(St, K, t, T, r, sigma):\n",
    "    ''' Calculates Black-Scholes-Merton European put option value.\n",
    "    Parameters\n",
    "    ==========\n",
    "    St : float\n",
    "        stock/index level at time t\n",
    "    K : float\n",
    "        strike price\n",
    "    t : float\n",
    "        valuation date\n",
    "    T : float\n",
    "        date of maturity/time-to-maturity if t = 0; T > t\n",
    "    r : float\n",
    "        constant, risk-less short rate\n",
    "    sigma : float\n",
    "        volatility\n",
    "    Returns\n",
    "    =======\n",
    "    put_value : float\n",
    "        European put present value at t\n",
    "    '''\n",
    "    put_value = BSM_call_value(St, K, t, T, r, sigma) \\\n",
    "        - St + math.exp(-r * (T - t)) * K\n",
    "    return put_value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:55:35.112902Z",
     "start_time": "2019-04-10T11:55:35.065288Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# CRR欧式期权\n",
    "def CRR_european_option_value(S0, K, T, r, sigma, otype, M=4):\n",
    "    ''' Cox-Ross-Rubinstein European option valuation.\n",
    "    Parameters\n",
    "    ==========\n",
    "    S0 : float\n",
    "        stock/index level at time 0\n",
    "    K : float\n",
    "        strike price\n",
    "    T : float\n",
    "        date of maturity\n",
    "    r : float\n",
    "        constant, risk-less short rate\n",
    "    sigma : float\n",
    "        volatility\n",
    "    otype : string\n",
    "        either 'call' or 'put'\n",
    "    M : int\n",
    "        number of time intervals\n",
    "    '''\n",
    "    # 生成二叉树\n",
    "    dt = T / M  # length of time interval\n",
    "    df = math.exp(-r * dt)  # discount per interval\n",
    "\n",
    "    # 计算udp\n",
    "    u = math.exp(sigma * math.sqrt(dt))  # up movement\n",
    "    d = 1 / u  # down movement\n",
    "    q = (math.exp(r * dt) - d) / (u - d)  # martingale branch probability\n",
    "\n",
    "    # 初始化幂矩阵\n",
    "    mu = np.arange(M + 1)\n",
    "    mu = np.resize(mu, (M + 1, M + 1))\n",
    "    #print(mu)\n",
    "    md = np.transpose(mu)\n",
    "    #print(md)\n",
    "    #print(mu - md)\n",
    "    mu = u ** (mu - md)\n",
    "    md = d ** md\n",
    "    #print(mu)\n",
    "    #print(md)\n",
    "    \n",
    "    #得到各节点的股票价格\n",
    "    S = S0 * mu * md\n",
    "\n",
    "    # 得到叶子结点的期权价值\n",
    "    if otype == 'call':\n",
    "        V = np.maximum(S - K, 0)  # inner values for European call option\n",
    "    else:\n",
    "        V = np.maximum(K - S, 0)  # inner values for European put option\n",
    "\n",
    "    #逐步向前加权平均并折现，得到期初期权价值\n",
    "    for z in range(0, M):  # backwards iteration\n",
    "        #逐列更新期权价值，相当于二叉树中的逐层向前折算\n",
    "        V[0:M - z, M - z - 1] = (q * V[0:M - z, M - z] +\n",
    "                         (1 - q) * V[1:M - z + 1, M - z]) * df\n",
    "    return V[0, 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:55:35.183870Z",
     "start_time": "2019-04-10T11:55:35.115878Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# CRR美式期权\n",
    "def CRR_american_option_value(S0, K, T, r, sigma, otype, M=4):\n",
    "    # 一.生成二叉树\n",
    "    dt = T / M  # length of time interval\n",
    "    df = math.exp(-r * dt)  # discount per interval\n",
    "    inf = math.exp(r * dt)  # discount per interval\n",
    "\n",
    "    # 计算udp\n",
    "    u = math.exp(sigma * math.sqrt(dt))  # up movement\n",
    "    d = 1 / u  # down movement\n",
    "    q = (math.exp(r * dt) - d) / (u - d)  # martingale branch probability\n",
    "    \n",
    "    # 初始化幂矩阵\n",
    "    mu = np.arange(M + 1)\n",
    "    mu = np.resize(mu, (M + 1, M + 1))\n",
    "    md = np.transpose(mu)\n",
    "    \n",
    "    # 计算个节点单向变动时的股票价格\n",
    "    mus = u ** (mu - md)\n",
    "    mds = d ** md\n",
    "    \n",
    "    # 得到各节点的股票价格\n",
    "    S = S0 * mus * mds \n",
    "        \n",
    "    # 二.计算每个节点股票的预期价格\n",
    "    mes = S0 * inf ** mu\n",
    "\n",
    "    # 三.得到叶子结点的期权价值\n",
    "    if otype == 'call':\n",
    "        V = np.maximum(S - K, 0)     \n",
    "        #计算每个节点提前行权的收益\n",
    "        oreturn = mes - K\n",
    "    else:\n",
    "        V = np.maximum(K - S, 0)       \n",
    "        #计算每个节点提前行权的收益\n",
    "        oreturn = K - mes\n",
    "\n",
    "    # 四.逐步向前加权平均折现和提前行权的收益比较，得到期初期权价值\n",
    "    for z in range(0, M):  # backwards iteration\n",
    "        #计算后期折现的后期价格\n",
    "        ovalue = (q * V[0:M - z, M - z] +\n",
    "                         (1 - q) * V[1:M - z + 1, M - z]) * df\n",
    "        #逐列更新期权价值，相当于二叉树中的逐层向前折算\n",
    "        #期权价格取后期折现和提前行权获得收益的最大值\n",
    "        V[0:M - z, M - z - 1] = np.maximum(ovalue, oreturn[0:M - z, M - z - 1])\n",
    "        \n",
    "    return V[0, 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:55:35.747634Z",
     "start_time": "2019-04-10T11:55:35.741195Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 输入参数\n",
    "S0 = 100.0  # index level\n",
    "K = 100.0  # option strike\n",
    "T = 1.0  # maturity date\n",
    "r = 0.05  # risk-less short rate\n",
    "sigma = 0.2  # volatility"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:55:36.536706Z",
     "start_time": "2019-04-10T11:55:36.511451Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "12.786487798399586\n",
      "10.430611662249113\n"
     ]
    }
   ],
   "source": [
    "mmin=2\n",
    "mmax=200\n",
    "step_size=1\n",
    "print(CRR_american_option_value(S0, K, T, r, sigma, 'call', 100))\n",
    "print(CRR_european_option_value(S0, K, T, r, sigma, 'call', 100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T11:59:19.314868Z",
     "start_time": "2019-04-10T11:59:18.851152Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nCfA88GrJaWuA34fnLyMIgPYq81q3ufskd59UOkOi5sERERFpXPWaB+dtd58NYGY/AW42s4HAFndf\nA/wG2Cc83g6kge7Hq5XIunpwREREGlW9ApzvmNljwEbgF+6+xMyuA94G5gHfAq4zs1nAvsB57r5N\ng+hzjlYTFxERaVB1CXDc/agy+2bEHr8LXLA975FTkbGIiEjDSuxEf1lN9CciItIjTz31FMcccwyH\nH344c+bM4cILL+SMM85g06ZNLF68mLPPPps5c+YwY8YMTjjhBFauXMmrr77K+eefTzqdZvHixUWv\nt3DhQsyMWbNmsWXLll65hkSuReXuuFJUIiKSBMcc03nfmWfCRRfB++/DiSd2Pn7++cF/q1bB6acX\nH/uP/9jqWx566KEcc8wxrF27Nr8q+OTJk3nwwQf58Y9/zLnnnpuf1fjqq69m/fr1jBo1ivPPP5/F\nixczZ84c7r777vzrLViwAIBZs2bR1NQ7oUcie3By4dyFCnBERES2Xy6XY/Xq1QwZMoShQ4fy/e9/\nn2effRaA2bNnM2rUqPy506ZN4/e//z3PPfccEKxMftJJJ/V6mxPZg5MLZ2fWYpsiItLnddfj0tbW\n/fHBgyvqsenKU089xbx58/jjH//I+PHjmThxIhMmTGD+/Pl85jOfYe3atXz2s5/l8ssvJ5PJANDS\n0sLMmTOZM2cO9957LwsXLuTmm2/ucRt6KpEhQDbswtFaVCIiIj136KGHMnPmTO666y72339/Lrvs\nMnbaaSeuuOIKFi9ezK9//Wvuv/9+br311qLnTZs2jWeeeYa5c+eWXaCzNyQywGlOp3jgS0dyxqTh\n9W6KiIhIIgwbNozXX3+dk08+mfXr1wMwZswYjjjiCDZt2lR0bnNzM7NmzeLhhx9mypQp9WhuMlNU\nqZRx4J671LsZIiIifdKiRYt49NFH2bRpE1dffTVbtmzhueee46qrruIXv/gFU6dOZezYsaxdu5a1\na9dywQUX0NHRwZ133snf//53jjzySKZPn8706dMBuOGGGwCYP39+vmi51np9NfFaKV1NXEREpC/S\nauKBvriauIiIiEhNKcARERGRxFGAIyIisoNJSvlIJWp1rQpwREREdiCtra2sXr26IYIcd2f16tW0\ntrZW/bUTOYpKRESkrxo+fDgrVqygo6Oj3k3pFa2trQwfXv1pXRTgiIiI7EAymUzR0gfSM0pRiYiI\n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\nh67QBwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 648x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "BSM_benchmark = BSM_call_value(S0, K, 0, T, r, sigma)\n",
    "m = range(mmin, mmax, step_size)\n",
    "CRR_values = [CRR_european_option_value(S0, K, T, r, sigma, 'call', M) for M in m]\n",
    "plt.figure(figsize=(9, 5))\n",
    "plt.plot(m, CRR_values, label='CRR')\n",
    "plt.axhline(BSM_benchmark, color='r', ls='dashed', lw=1.5,\n",
    "            label='BSM')\n",
    "plt.xlabel('Steps')\n",
    "plt.ylabel('European call option value')\n",
    "plt.legend(loc=4)\n",
    "plt.xlim(0, mmax)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
